/*********************************************************************************************************
* 模块名称：SPI.c
* 摘    要：SPI模块
* 当前版本：1.0.0
* 作    者：jadewo
* 完成日期：2025年05月23日
* 内    容：SPI
* 注    意：
**********************************************************************************************************
* 取代版本：
* 作    者：
* 完成日期：
* 修改内容：
* 修改文件：
*********************************************************************************************************/

/*********************************************************************************************************
*                                              包含头文件
*********************************************************************************************************/
#include "SPI.h"
#include "gd32f30x_conf.h"


/*********************************************************************************************************
*                                              宏定义
*********************************************************************************************************/


/*********************************************************************************************************
*                                              枚举结构体
*********************************************************************************************************/

/*********************************************************************************************************
*                                              内部变量定义
*********************************************************************************************************/

/*********************************************************************************************************
*                                              内部函数声明
*********************************************************************************************************/
static void SPISetMOSI(unsigned char val);
static void ConfigSPIGPIO(void);
/*********************************************************************************************************
*                                              内部函数实现
*********************************************************************************************************/
static void SPISetMOSI(unsigned char val)
{
    if(val)
    {
        SET_SPI_MOSI();
    }
    else
    {
        CLR_SPI_MOSI();
    }
}

static void ConfigSPIGPIO(void)
{
    //配置 PE2
    rcu_periph_clock_enable(RCU_GPIOC); //使能 GPIOE 的时钟
    gpio_init(GPIOC, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13); //设置 GPIO 输出模式及速度
    gpio_bit_set(GPIOC, GPIO_PIN_13); //将 PC13 默认状态设置为高电平

    //配置 PA5
    rcu_periph_clock_enable(RCU_GPIOA); //使能 GPIOB 的时钟
    gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5); //设置 GPIO 输出模式及速度
    gpio_bit_set(GPIOA, GPIO_PIN_5); //将 PA5 默认状态设置为高电平

    //配置 PA6 
    gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_6); //设置 PA6 为输入模式

    //配置 PA7
    gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7); //设置 GPIO 输出模式及速度
    gpio_bit_set(GPIOA, GPIO_PIN_7); //将 PA7 默认状态设置为高电平
}


/*********************************************************************************************************
*                                              API函数实现
*********************************************************************************************************/
void InitSPI(void)
{
    ConfigSPIGPIO();

    SET_SPI_NSS();
    CLR_SPI_SCK();
    SET_SPI_MOSI();
}

void Delayus(uint32_t nCount)
{
    nCount = nCount * 4;
    for(; nCount != 0; nCount--);
}

unsigned char SPIReadWriteByte(unsigned char val)
{
    unsigned char i;
    unsigned char RevData = 0;

    for(i = 0; i < 8; i++)
    {
        CLR_SPI_SCK();
        SPISetMOSI(val & 0x80);
        Delayus(1);
        val <<= 1;
        SET_SPI_SCK();
        RevData <<= 1;
        RevData |= READ_SPI_MISO();
        Delayus(1);
    }

    return RevData;
}

unsigned char W25Q64ReadWriteData(unsigned char val)
{
    return SPIReadWriteByte(val);
}
